from datetime import datetime
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, DateTime, Text, Date, Enum, BigInteger, Float, DECIMAL, Index, UniqueConstraint
from .connection import Base

# 用户模型
class User(Base):
    """
    用户数据表模型
    对应MySQL数据库中的users表
    """
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    username = Column(String(50), unique=True, index=True, nullable=True)
    password = Column(String(255), nullable=True)
    nickname = Column(String(50), default=None)  # 昵称
    avatar = Column(String(500), default=None)  # 头像
    background_cover = Column(String(500), default=None)  # 背景
    gender = Column(Integer, default=3)  # 性别 1-男 2-女 3-保密
    age = Column(Integer, default=0)  # 年龄
    country = Column(String(50), default=None)  # 国家
    province = Column(String(50), default=None)  # 省份
    city = Column(String(50), default=None)  # 城市
    district = Column(String(50), default=None)  # 区县
    address = Column(String(200), default=None)  # 地址
    role = Column(Integer, default=1)  # 角色 1-普通用户 0-管理员 2-评委
    birthday = Column(Date, default=None)  # 生日
    signature = Column(String(200), default=None)  # 签名
    description = Column(String(200), default=None)  # 描述
    
    # 微信相关字段
    openid = Column(String(100), unique=True, index=True, default=None)  # 微信id
    wx_avatar = Column(String(500), default=None)  # 微信头像
    wx_nickname = Column(String(50), default=None)  # 微信昵称
    
    wx_id = Column(String(50), unique=True, index=True, default=None)  # 微信号
    qq_id = Column(String(50), unique=True, index=True, default=None)  # qq号
    email = Column(String(100), unique=True, index=True, default=None)  # 邮箱
    
    # 联系方式
    phone = Column(String(11), unique=True, index=True, default=None)  # 手机号
    
    
    # 社交媒体ID
    xhs_id = Column(String(50), unique=True, index=True, default=None)  # 小红书id
    dy_id = Column(String(50), unique=True, index=True, default=None)  # 抖音id
    wb_id = Column(String(50), unique=True, index=True, default=None)  # 微博id

    # 统计数据
    like_num = Column(Integer, default=0)  # 点赞数
    comment_num = Column(Integer, default=0)  # 评论数
    follow_num = Column(Integer, default=0)  # 关注数
    fans_num = Column(Integer, default=0)  # 粉丝数
    video_num = Column(Integer, default=0)  # 视频数
    collect_num = Column(Integer, default=0)  # 收藏数

    # 时间字段
    login_time = Column(DateTime, default=datetime.now)  # 登录时间
    create_time = Column(DateTime, default=datetime.now)  # 创建时间
    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now)  # 更新时间
    is_delete = Column(Boolean, default=False)  # 删除状态
    points = Column(Integer, default=0)  # 积分


    def __repr__(self):
        return f"<User(id={self.id}, username='{self.username}', nickname='{self.nickname}')>"

# 用户关注表
class UserFollow(Base):
    """
    用户关注关系表模型
    记录用户之间的关注关系
    """
    __tablename__ = "user_follows"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    follower_id = Column(Integer, nullable=False, index=True, comment='关注者用户ID')  # 谁关注了
    following_id = Column(Integer, nullable=False, index=True, comment='被关注者用户ID')  # 被谁关注
    follow_time = Column(DateTime, default=datetime.now, comment='关注时间')  # 关注时间
    is_delete = Column(Boolean, default=False, comment='删除状态')  # 删除状态
    
    # 添加唯一约束，防止重复关注
    __table_args__ = (
        Index('idx_follower_following', 'follower_id', 'following_id'),
        UniqueConstraint('follower_id', 'following_id', name='uk_follower_following'),
    )

    def __repr__(self):
        return f"<UserFollow(id={self.id}, follower_id={self.follower_id}, following_id={self.following_id})>"

# 上传文件
class UploadFile(Base):
    """
    文件上传记录表
    用于记录用户上传的文件信息
    """
    __tablename__ = "upload_files"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    user_id = Column(Integer, index=True, nullable=False)  # 上传用户ID
    original_name = Column(String(255), nullable=False)  # 原始文件名
    file_name = Column(String(255), nullable=False)  # 存储文件名
    file_path = Column(String(500), nullable=False)  # 文件路径
    file_size = Column(BigInteger, nullable=False)  # 文件大小(字节)
    file_type = Column(String(50), nullable=False)  # 文件类型
    mime_type = Column(String(100), nullable=False)  # MIME类型
    upload_time = Column(DateTime, default=datetime.now)  # 上传时间
    is_delete = Column(Boolean, default=False)  # 删除状态

    def __repr__(self):
        return f"<UploadFile(id={self.id}, user_id={self.user_id}, original_name='{self.original_name}')>"

# 工具模型
class Tools(Base):
    """
    工具数据表模型
    对应MySQL数据库中的tools表
    """
    __tablename__ = "tools"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True, comment='主键ID')
    created_at = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    updated_at = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment='更新时间')
    title = Column(String(255), nullable=False, comment='工具标题')
    description = Column(Text, nullable=True, comment='工具描述')
    url = Column(String(500), nullable=False, comment='工具链接')
    direct_link = Column(String(500), nullable=True, comment='直接访问链接')
    category = Column(String(100), nullable=False, comment='工具分类')
    image = Column(String(500), nullable=True, comment='工具图标URL')
    sort_order = Column(Integer, nullable=True, comment='排序权重')
    upload_by = Column(Integer, nullable=True, comment='上传用户ID')
    is_active = Column(Boolean, nullable=True, default=True, comment='是否启用')
    click_count = Column(Integer, nullable=True, default=0, comment='点击统计')

    def __repr__(self):
        return f"<Tools(id={self.id}, title='{self.title}', category='{self.category}')>"
        
# 工具分类模型
class Tools_type(Base):
    """
    工具分类数据表模型
    对应MySQL数据库中的tools_type表
    """
    __tablename__ = "tools_type"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    name = Column(String, index=True)  # 分类名称
    icon = Column(String, nullable=True, comment='分类图标')
    sort_order = Column(Integer, nullable=True, default=0, comment='排序')
    is_active = Column(Boolean, nullable=True, default=True, comment='是否启用')
    created_by = Column(Integer, nullable=True, comment='创建用户ID')  # 创建时间
    created_at = Column(DateTime, default=datetime.now)  # 创建时间


# 比赛模型
class Competition(Base):
    """
    比赛数据表模型
    对应MySQL数据库中的competition表
    """
    __tablename__ = "competition"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    name = Column(String, index=True)  # 比赛名称
    type = Column(String)  # 比赛类型（图片，视频）
    competition_rule = Column(Text)  # 比赛规则（上传规则说明图片）
    description = Column(Text)  # 比赛描述
    content = Column(Text)  # 比赛内容
    cover = Column(String)  # 比赛封面
    competition_number = Column(Integer, default=50)  # 参赛数量
    competition_time = Column(DateTime)  # 比赛时间
    competition_end_time = Column(DateTime)  # 比赛结束时间
    judge_number = Column(Integer, default=10)  # 评委数量
    judge_ids = Column(String)  # 评委id
    competition_status = Column(Integer, default=1)  # 比赛状态 1-正常 2-禁用
    competition_award = Column(Text)  # 比赛奖项（金，银，铜，优秀）/ 图片

    create_time = Column(DateTime, default=datetime.now)  # 创建时间
    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now)  # 更新时间
    delete_time = Column(DateTime, default=None)  # 删除时间

    def __repr__(self):
        return f"<Competition(id={self.id}, name='{self.name}', type='{self.type}')>"

# 比赛作品模型
class CompetitionWork(Base):
    """
    参赛作品数据表模型
    对应MySQL数据库中的competition_work表
    """
    __tablename__ = "competition_work"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    competition_id = Column(Integer)  # 比赛id
    user_id = Column(Integer)  # 用户id
    work_name = Column(String)  # 作品名称
    work_description = Column(Text)  # 作品描述
    work_file = Column(String)  # 作品文件
    work_type = Column(String)  # 作品类型（图片，视频）
    work_cover = Column(String)  # 作品封面

    work_sort = Column(Integer, default=1)  # 作品排序

    # 社交媒体链接
    xhs_url = Column(String)  # 小红书链接
    dy_url = Column(String)  # 抖音链接
    wb_url = Column(String)  # 微博链接
    sph_url = Column(String)  # 视频号链接
    
    # 社交媒体点赞数
    xhs_like = Column(Integer, default=0)  # 小红书点赞数
    dy_like = Column(Integer, default=0)  # 抖音点赞数
    wb_like = Column(Integer, default=0)  # 微博点赞数
    sph_like = Column(Integer, default=0)  # 视频号点赞数
    
    # 社交媒体收藏数
    xhs_collect = Column(Integer, default=0)  # 小红书收藏数
    dy_collect = Column(Integer, default=0)  # 抖音收藏数
    sph_collect = Column(Integer, default=0)  # 视频号收藏数
    
    # 社交媒体转发数
    wb_zf = Column(Integer, default=0)  # 微博转发
    # 社交媒体评论数
    xhs_comment = Column(Integer, default=0)  # 小红书评论数
    dy_comment = Column(Integer, default=0)  # 抖音评论数
    wb_comment = Column(Integer, default=0)  # 微博评论数
    sph_comment = Column(Integer, default=0)  # 视频号评论数

    work_like = Column(Integer, default=0)  # 作品点赞
    work_comment = Column(Integer, default=0)  # 作品评论
    work_score = Column(Integer, default=0)  # 作品评分
    work_rank = Column(Integer, default=0)  # 作品排名
    work_award = Column(String, default=None)  # 作品奖项（金，银，铜，优秀）
    work_views = Column(Integer, default=0)  # 作品浏览量
    work_label = Column(String, default=None)  # 作品标签，根据作品类型自动设置
    isPinned = Column(Boolean, default=False, comment='是否置顶')
    
    # assign = Column(String, default=None)  # 作品分配
    wx_id = Column(String, default=None)  # 微信号
    email = Column(String, default=None)  # 邮箱
    release_status = Column(Integer, default=2)  # 发布状态 1-提交作品 2-存为草稿
    work_status = Column(Integer, default=2)  # 作品状态 1-参赛 2-未参赛
    work_audit_status = Column(Integer, default=1)  # 作品审核状态 0-未审核 1-审核中 2-审核通过 3-审核不通过
    create_time = Column(DateTime, default=datetime.now)  # 创建时间
    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now)  # 更新时间
    delete_time = Column(DateTime, default=None)  # 删除时间

    def __repr__(self):
        return f"<CompetitionWork(id={self.id}, work_name='{self.work_name}', competition_id={self.competition_id})>"


# 用户等级积分模型
class UserLevel(Base):
    """
    用户等级积分表
    用于记录用户等级和所需积分信息
    """
    __tablename__ = "user_levels"

    level_id = Column(Integer, primary_key=True, index=True)  # 等级ID
    level_name = Column(String(50), nullable=False)  # 等级名称
    required_points = Column(Integer, nullable=False)  # 所需积分
    upgrade_points = Column(Integer, nullable=False)  # 升级积分
    url = Column(String(255), nullable=False)  # 等级图标URL
    url2 = Column(String(255), nullable=False)  # 等级图标URL2

    def __repr__(self):
        return f"<UserLevel(level_id={self.level_id}, level_name='{self.level_name}', required_points={self.required_points})>"


# 奖项积分模型
class AwardPoints(Base):
    """
    奖项积分表模型
    对应MySQL数据库中的award_points表
    """
    __tablename__ = "award_points"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True)  # 主键ID
    award_name = Column(String(50), nullable=False, unique=True)  # 奖项名称
    points = Column(Integer, nullable=False)  # 积分值

    def __repr__(self):
        return f"<AwardPoints(id={self.id}, award_name='{self.award_name}', points={self.points})>"


class ScoreDimensions(Base):
    """
    AI作品评分维度配置表模型
    对应MySQL数据库中的score_dimensions表
    存储5个核心维度的权重及基础描述
    """
    __tablename__ = "score_dimensions"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True, comment='维度唯一ID')
    dimension_name = Column(
        String(50),
        nullable=False, unique=True, comment='维度名称（支持动态添加新维度）'
    )
    dimension_weight = Column(Integer, nullable=False, comment='维度权重（作品概念30、画面美术25、动画表演20、视听语言15、创新性10）')
    dimension_desc = Column(String(500), nullable=False, comment='维度核心描述')
    create_time = Column(DateTime, nullable=False, default=datetime.now, comment='配置创建时间')

    def __repr__(self):
        return f"<ScoreDimensions(id={self.id}, dimension_name='{self.dimension_name}', dimension_weight={self.dimension_weight})>"


class DimensionScoreRules(Base):
    """
    评分维度规则表模型
    定义每个评分维度的具体评判标准和等级描述
    """
    __tablename__ = "dimension_score_rules"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True, comment='规则唯一ID')
    dimension_id = Column(Integer, ForeignKey('score_dimensions.id'), nullable=False, comment='关联评分维度ID')
    score_level = Column(Integer, nullable=False, comment='评分等级（1分最低，支持自定义扩展到10分）')
    level_desc = Column(String(50), nullable=False, comment='等级描述（如"卓越""优秀""合格""不足""极差"）')
    judge_criteria = Column(Text, nullable=False, comment='具体评判标准')
    create_time = Column(DateTime, nullable=False, default=datetime.now, comment='规则创建时间')

    def __repr__(self):
        return f"<DimensionScoreRules(id={self.id}, dimension_id={self.dimension_id}, score_level={self.score_level}, level_desc='{self.level_desc}')>"


class CommentLike(Base):
    """
    用户评论点赞记录表模型
    记录用户对评论的点赞状态，防止重复点赞
    """
    __tablename__ = "comment_likes"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True, comment='点赞记录唯一ID')
    comment_id = Column(Integer, ForeignKey('work_comments.id'), nullable=False, index=True, comment='评论ID')
    user_id = Column(Integer, ForeignKey('users.id'), nullable=False, index=True, comment='点赞用户ID')
    is_like = Column(Boolean, default=True, comment='点赞状态：True-点赞，False-取消点赞')
    create_time = Column(DateTime, default=datetime.now, comment='创建时间')
    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')

    # 创建唯一约束，防止同一用户对同一评论重复点赞记录
    __table_args__ = (
        UniqueConstraint('comment_id', 'user_id', name='uk_comment_user_like'),
        Index('idx_comment_like', 'comment_id', 'is_like'),
        Index('idx_user_like', 'user_id', 'create_time'),
    )

    def __repr__(self):
        return f"<CommentLike(id={self.id}, comment_id={self.comment_id}, user_id={self.user_id}, is_like={self.is_like})>"


class WorkComment(Base):
    """
    作品评论表模型
    支持无限级评论功能，通过parent_id实现评论的层级关系
    """
    __tablename__ = "work_comments"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True, comment='评论唯一ID')
    work_id = Column(Integer, ForeignKey('competition_work.id'), nullable=False, index=True, comment='关联作品ID')
    user_id = Column(Integer, ForeignKey('users.id'), nullable=False, index=True, comment='评论用户ID')
    parent_id = Column(Integer, ForeignKey('work_comments.id'), nullable=True, index=True, comment='父评论ID，为空表示顶级评论')
    content = Column(Text, nullable=False, comment='评论内容')
    like_count = Column(Integer, default=0, comment='点赞数')
    reply_count = Column(Integer, default=0, comment='回复数')
    reply_name = Column(String(50), nullable=True, comment='回复人昵称，用于子评论显示')
    is_delete = Column(Boolean, default=False, comment='删除状态')
    create_time = Column(DateTime, default=datetime.now, comment='创建时间')
    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')
    delete_time = Column(DateTime, default=None, comment='删除时间')

    # 创建索引以优化查询性能
    __table_args__ = (
        Index('idx_work_parent', 'work_id', 'parent_id'),
        Index('idx_user_time', 'user_id', 'create_time'),
    )

    def __repr__(self):
        return f"<WorkComment(id={self.id}, work_id={self.work_id}, user_id={self.user_id}, parent_id={self.parent_id})>"


class WorkLike(Base):
    """
    用户作品点赞记录表模型
    记录用户对作品的点赞状态，防止重复点赞
    """
    __tablename__ = "work_likes"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True, comment='点赞记录唯一ID')
    work_id = Column(Integer, ForeignKey('competition_work.id'), nullable=False, index=True, comment='作品ID')
    user_id = Column(Integer, ForeignKey('users.id'), nullable=False, index=True, comment='点赞用户ID')
    is_like = Column(Boolean, default=True, comment='点赞状态：True-点赞，False-取消点赞')
    create_time = Column(DateTime, default=datetime.now, comment='创建时间')
    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')

    # 创建唯一约束，防止同一用户对同一作品重复点赞记录
    __table_args__ = (
        UniqueConstraint('work_id', 'user_id', name='uk_work_user_like'),
        Index('idx_work_like', 'work_id', 'is_like'),
        Index('idx_user_work_like', 'user_id', 'create_time'),
    )

    def __repr__(self):
        return f"<WorkLike(id={self.id}, work_id={self.work_id}, user_id={self.user_id}, is_like={self.is_like})>"


class WorkJudgeDimensionScore(Base):
    """
    裁判维度评分表
    记录评委对作品在各评分维度上的打分结果（维度以ID关联score_dimensions）
    """
    __tablename__ = "work_judge_dimension_score"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True, comment='评分记录唯一ID')
    competition_id = Column(Integer, nullable=False, index=True, comment='比赛ID')
    work_id = Column(Integer, ForeignKey('competition_work.id'), nullable=False, index=True, comment='作品ID')
    judge_id = Column(Integer, ForeignKey('users.id'), nullable=False, index=True, comment='评委ID')
    dimension_id = Column(Integer, ForeignKey('score_dimensions.id'), nullable=False, index=True, comment='评分维度ID（关联score_dimensions.id）')
    rate = Column(DECIMAL(5, 2), nullable=False, comment='评分（0.5-5，支持小数）')
    comment = Column(Text, nullable=True, comment='评分备注（可选）')
    create_time = Column(DateTime, default=datetime.now, comment='创建时间')
    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')

    __table_args__ = (
        UniqueConstraint('judge_id', 'work_id', 'dimension_id', name='uk_judge_work_dimension'),
        Index('idx_work_dimension', 'work_id', 'dimension_id'),
        Index('idx_competition_work', 'competition_id', 'work_id'),
    )

    def __repr__(self):
        return f"<WorkJudgeDimensionScore(id={self.id}, competition_id={self.competition_id}, work_id={self.work_id}, judge_id={self.judge_id}, dimension_id={self.dimension_id}, rate={self.rate})>"


class UserLike(Base):
    """
    用户点赞记录表模型
    记录用户对其他用户的点赞状态，防止重复点赞
    """
    __tablename__ = "user_likes"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True, comment='点赞记录唯一ID')
    target_user_id = Column(Integer, ForeignKey('users.id'), nullable=False, index=True, comment='被点赞用户ID')
    liker_user_id = Column(Integer, ForeignKey('users.id'), nullable=False, index=True, comment='点赞用户ID')
    is_like = Column(Boolean, default=True, comment='点赞状态：True-点赞，False-取消点赞')
    create_time = Column(DateTime, default=datetime.now, comment='创建时间')
    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')


class UserNotification(Base):
    """
    用户通知记录表模型
    记录关注消息、评论回复消息、作品获奖消息、系统消息、比赛创建通知等
    """
    __tablename__ = "user_notifications"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True, comment='通知唯一ID')
    user_id = Column(Text, nullable=False, index=True, comment='需要接收该通知的用户ID列表')
    is_read_id = Column(Text, nullable=True, default=None, comment='标记已读的用户ID列表')
    is_delete_id = Column(Text, nullable=True, default=None, comment='已删除该通知的用户ID列表')
    sender_id = Column(Integer, ForeignKey('users.id'), nullable=True, index=True, comment='发送通知的用户ID（系统消息时为空）')
    
    # 通知类型：1-system 2-notice 3-follow
    notification_type = Column(Integer, nullable=False, index=True, comment='通知类型：1-system 2-notice 3-follow')
    title = Column(String(100), nullable=False, comment='通知标题')
    content = Column(Text, nullable=False, comment='通知内容')
    
    # 关联数据ID（根据通知类型不同，可能关联不同的表）
    related_id = Column(Integer, nullable=True, index=True, comment='关联数据ID')
    related_type = Column(String(50), nullable=True, comment='关联数据类型（work、comment、follow等）')
    

    # 时间字段
    create_time = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    delete_time = Column(DateTime, nullable=True, default=None, comment='删除时间')

    def __repr__(self):
        return f"<UserNotification(id={self.id}, user_id={self.user_id}, notification_type={self.notification_type})>"


class Banner(Base):
    """
    首页轮播图数据模型
    """
    __tablename__ = "banners"
    
    id = Column(Integer, primary_key=True, index=True, comment="轮播图ID")
    title = Column(String(255), nullable=False, comment="轮播图标题")
    image_url = Column(String(500), nullable=False, comment="轮播图图片URL")
    link_url = Column(String(500), nullable=True, comment="点击跳转链接")
    description = Column(Text, nullable=True, comment="轮播图描述")
    sort_order = Column(Integer, default=0, comment="排序顺序，数字越小越靠前")
    is_active = Column(Boolean, default=True, comment="是否启用")
    enable_time = Column(DateTime, default=datetime.now, comment="启用时间，只有>=启用时间才能返回数据")
    create_time = Column(DateTime, default=datetime.now, comment="创建时间")
    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
    delete_time = Column(DateTime, default=None, comment="删除时间")
    is_delete = Column(Boolean, default=False, comment="是否删除")

    def __repr__(self):
        return f"<Banner(id={self.id}, title='{self.title}', is_active={self.is_active})>"


class SiteInfo(Base):
    """
    网站基础信息数据表模型
    保存站点名称、描述、关键词、Logo、ICP备案号及联系信息
    """
    __tablename__ = "site_info"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True, comment='主键ID')
    site_name = Column(String(100), nullable=False, comment='网站名称')
    site_description = Column(Text, nullable=True, comment='网站描述')
    site_keywords = Column(String(255), nullable=True, comment='网站关键词')
    logo_url = Column(String(500), nullable=True, comment='网站Logo URL')
    icp_number = Column(String(64), nullable=True, comment='ICP备案号')
    contact_email = Column(String(100), nullable=True, comment='联系邮箱')
    service_phone = Column(String(20), nullable=True, comment='客服电话')
    company_address = Column(String(255), nullable=True, comment='公司地址')
    is_active = Column(Boolean, default=True, comment='是否为当前生效配置')
    created_at = Column(DateTime, default=datetime.now, comment='创建时间')
    updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')

    __table_args__ = (
        Index('idx_site_active', 'is_active'),
    )

    def __repr__(self):
        return f"<SiteInfo(id={self.id}, site_name='{self.site_name}', is_active={self.is_active})>"

# 扫码登录会话表
class LoginSession(Base):
    """
    扫码登录会话表：映射 session_id 与 scene_id，并记录登录状态
    """
    __tablename__ = "login_sessions"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    session_id = Column(String(64), unique=True, index=True, nullable=False)
    scene_id = Column(Integer, unique=True, index=True, nullable=False)
    status = Column(String(16), default="pending", nullable=False)
    openid = Column(String(128), nullable=True)
    user_id = Column(Integer, nullable=True)
    expire_time = Column(DateTime, nullable=False)
    create_time = Column(DateTime, default=datetime.now)
    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now)


# 网页授权状态表（用于 OAuth2 state 校验）
class OauthState(Base):
    """
    网页授权state记录表：存储state与过期时间，用于回调校验
    """
    __tablename__ = "oauth_states"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    state = Column(String(64), unique=True, index=True, nullable=False)
    expire_time = Column(DateTime, nullable=False)
    create_time = Column(DateTime, default=datetime.now)

    
class SystemConfig(Base):
    """
    系统配置数据表模型
    保存SMTP、账号密码、手机号、抖音密码、小红书登录Cookie等运行配置
    """
    __tablename__ = "system_config"

    id = Column(Integer, primary_key=True, index=True, autoincrement=True, comment='主键ID')
    smtp_server = Column(String(100), nullable=False, default='smtp.qq.com', comment='SMTP服务器')
    smtp_port = Column(Integer, nullable=False, default=587, comment='SMTP端口')
    email = Column(String(100), nullable=True, comment='邮箱账户')
    email_password = Column(Text, nullable=True, comment='邮箱密码（加密存储）')
    phone_number = Column(String(20), nullable=True, comment='手机号')
    douyin_password = Column(Text, nullable=True, comment='抖音登录密码（加密存储）')
    xhs_cookie = Column(Text, nullable=True, comment='小红书登录Cookie（加密存储）')
    is_active = Column(Boolean, default=True, comment='是否为当前生效配置')
    created_at = Column(DateTime, default=datetime.now, comment='创建时间')
    updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')

    __table_args__ = (
        Index('idx_config_active', 'is_active'),
    )

    def __repr__(self):
        return f"<SystemConfig(id={self.id}, smtp_server='{self.smtp_server}', smtp_port={self.smtp_port}, is_active={self.is_active})>"
